// 全局变量
int position_x,position_y; // 飞机位置
int enemy_x[10],enemy_y[10]; // 子弹位置
int high,width; //  游戏画面尺寸
int startTime;  // 游戏开始时间
int endTime; // 游戏结束时间
int intervalTime;  // 控制子弹的移动速度


void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};  // 第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


void gotoxy(int x,int y)//类似于清屏函数
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}


void startup() // 数据初始化
{
	high = 20;
	width = 30;
	position_x = high/2;
	position_y = width/2;
	intervalTime = 10;
	startTime = clock();
	
	
	int i;
	for (i=0;i<10;i++) // 子弹位置随机初始化
	{
		enemy_x[i] = rand()%high;
		enemy_y[i] = rand()%width;
	}

	HideCursor();
}


void show()  // 显示画面
{
	gotoxy(0,0);  // 清屏
	int i,j;
	for (i=0;i<=high;i++)
	{
		for (j=0;j<=width;j++)
		{
			int k;
			int isBullet = 0;
			for (k=0;k<10;k++)
				if ((i==enemy_x[k]) && (j==enemy_y[k]))
				{
					printf("#");  //   输出子弹
					isBullet = 1;
				}
				if (!isBullet)
				{
					if ((i==position_x) && (j==position_y))
						printf("*");  //   输出飞机*
					else
						printf(" ");  //   输出空格
				}
		}
		printf("\n");
	}
	endTime = clock();
	printf("你坚持了：%.3f秒！\n",(endTime-startTime)/1000.0);
}	


void updateWithoutInput()  // 与用户输入无关的更新
{	
	int k;
	static int speed = 0;  
	if (speed<intervalTime)
		speed++;
	if (speed == intervalTime)
	{
		for (k=0;k<10;k++) // 子弹向我机移动
		{
			if (enemy_x[k]>position_x)
				if (rand()%3 == 2)
					enemy_x[k]--;
				if (enemy_x[k]<position_x)
					if (rand()%3 == 2)
						enemy_x[k]++;
					if (enemy_y[k]>position_y)
						if (rand()%3 == 2)
							enemy_y[k]--;
						if (enemy_y[k]<position_y)
							if (rand()%3 == 2)
								enemy_y[k]++;
							// 可以加入一点随机扰动，防止所有的飞机聚在一起
		}
		speed = 0;
	}
	for (k=0;k<10;k++)
	{
		if (position_x==enemy_x[k] && position_y==enemy_y[k]) 
		{
			system("pause");
			Sleep(2000);
			exit(0);
		}
	}
}


void updateWithInput()  // 与用户输入有关的更新
{
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == 'a' && position_y>0)   
			position_y--;  // 位置左移
		if (input == 'd' && position_y<width)
			position_y++;  // 位置右移
		if (input == 'w' && position_x>0)
			position_x--;  // 位置上移
		if (input == 's' && position_x<high)
			position_x++;  // 位置下移
	}
}


void main()
{
	startup();  // 数据初始化	
	while (1) //  游戏循环执行
	{
		show();  // 显示画面
		updateWithoutInput();  // 与用户输入无关的更新
		updateWithInput();  // 与用户输入有关的更新
	}
}
